/*
 * jsui 验证功能
 * 
 *  var Validate = require('jsui/Validate');
    var arr = {};
    arr['email'] = 'yuhaitao@163.com';
    arr['mobile'] = '13811309414';
    arr['username'] = 'yuhaitao';
    arr['password'] = '';

    var objValidate = new Validate(
        [
            {
                "obj": $('[name="phone"]'),
                "input":arr["username"],
                "require":"true",
                "message":'用户名不能为空'
            },
            {
                "obj": $('[name="passowrd"]'),
                "input":arr["password"],
                "require":"true",
                "message":'密码不能为空'
            },
            {
                "obj": $('[name="password"]'),
                "input":arr["email"], 
                "require":"true",
                "validator":"email",
                "message":'请正确填入Email'
            }
        ]
    );
    var error = objValidate.validate();
    if (error != null){
       //输出错误信息
       console.dir(error['message']);
       console.dir(error['obj']);

    }
 */
var Validate = function(options) {
  /**
   * 验证规则
   *
   * @var array
   */
  this.validator = {
    email: /^([.a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/,
    telephone: /^(0[0-9]{2,3}\-)?([2-9][0-9]{6,7})+(\-[0-9]{1,4})?$|(^(13[0-9]|15[0|3|6|7|8|9]|18[8|9])\d{8}$)/,
    phone: /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/,
    mobile: /^1[0-9]{10}$/,
    url: /^http:(\/){2}[A-Za-z0-9]+.[A-Za-z0-9]+[\/=?%-&_~`@\[\]\':+!]*([^<>\"\"])*$/,
    currency: /^[0-9]+(\.[0-9]+)?$/,
    number: /^[0-9]+$/,
    zip: /^[0-9][0-9]{5}$/,
    qq: /^[1-9][0-9]{4,8}$/,
    integer: /^[-+]?[0-9]+$/,
    integerpositive: /^[+]?[0-9]+$/,
    double: /^[-+]?[0-9]+(\.[0-9]+)?$/,
    doublepositive: /^[+]?[0-9]+(\.[0-9]+)?$/,
    english: /^[A-Za-z]+$/,
    chinese: /^[\x80-\xff]+$/,
    username: /^[\w]{3,}$/,
    nochinese: /^[A-Za-z0-9_-]+$/
  };
  /**
   * 存放验证信息
   *
   * @var array
   */

  this.validateparam = [];
  this.init(options);
};
Validate.prototype = {
  init: function(options) {
    $.extend(this.validateparam, options);
  },
  /**
   * 验证数组中的值
   *
   * <code>
   * //使用示例
   *      var Validate = require("jsui/Validate");
   *      var a = new Validate();
   *      a.setValidate("344d",true,"","不可以为空");
   *      a.setValidate("fdsfsfd", true, "Email", "请填写正确的EMAIL");
   *      console.dir(a.validate());
   *      //显示结果：
   *      请填写正确的EMAIL
   * </code>
   *
   * @param
   * @return string 字符串类型的返回结果
   */
  validate: function() {
    if (!this.validateparam) {
      return false;
    }
    for (var k = 0; k < this.validateparam.length; k++) {
      var v = this.validateparam[k];
      v["validator"] = v["validator"] || "";
      v["validator"] = v["validator"].toLowerCase();
      if (v["require"] == "") {
        v["require"] = false;
      }
      if (v["input"] == "" && v["require"] == "true") {
        this.validateparam[k]["result"] = false;
      } else {
        this.validateparam[k]["result"] = true;
      }

      if (this.validateparam[k]["result"] && v["input"] != "") {
        if (v["validator"] != "") {
          switch (v["validator"]) {
            case "custom":
              this.validateparam[k]["result"] = this.check(
                v["input"],
                v["regexp"]
              );
              break;
            case "compare":
              if (v["operator"] != "") {
                eval(
                  "result = '" +
                    v["input"] +
                    "'" +
                    v["operator"] +
                    "'" +
                    v["to"] +
                    "'" +
                    ";"
                );
                this.validateparam[k]["result"] = result;
              }
              break;
            case "length":
              //判断编码取字符串长度
              var input_length = v["input"].length;
              if (
                parseInt(v["min"]) >= 0 &&
                parseInt(v["max"]) > parseInt(v["min"])
              ) {
                this.validateparam[k]["result"] =
                  input_length >= parseInt(v["min"]) &&
                  input_length <= parseInt(v["max"]);
              } else if (
                parseInt(v["min"]) >= 0 &&
                parseInt(v["max"]) <= parseInt(v["min"])
              ) {
                this.validateparam[k]["result"] =
                  input_length == parseInt(v["min"]);
              }
              break;
            case "range":
              if (
                parseInt(v["min"]) >= 0 &&
                parseInt(v["max"]) > parseInt(v["min"])
              ) {
                this.validateparam[k]["result"] =
                  parseInt(v["input"]) >= parseInt(v["min"]) &&
                  parseInt(v["input"]) <= parseInt(v["max"]);
              } else if (
                parseInt(v["min"]) >= 0 &&
                parseInt(v["max"]) <= parseInt(v["min"])
              ) {
                this.validateparam[k]["result"] =
                  parseInt(v["input"]) == parseInt(v["min"]);
              }
              break;
            default:
              this.validateparam[k]["result"] = this.check(
                v["input"],
                this.validator[v["validator"]]
              );
          }
        }
      }
    }

    var error = this.getError();
    this.validateparam = [];
    return error;
  },
  /**
   * 正则表达式运算
   *
   * @param string $str 验证字符串
   * @param string $validator 验证规则
   * @return bool 布尔类型的返回结果
   */
  check: function(str, validator) {
    if (str != "" && validator != "") {
      if (validator.test(str)) {
        return true;
      } else {
        return false;
      }
    }
    return true;
  },
  /**
   * 需要验证的内容
   *
   * @param arrayvalidateparam
   *         {"input":"",
   *          "require":"",
   *          "validator":"",
   *          "regexp":"",
   *          "operator":"",
   *          "to":"",
   *          "min":"",
   *          "max":"",
   *          message:""}
   * input要验证的值
   * require是否必填，true是必填false是可选
   * validator验证的类型:
   * 其中Compare，Custom，Length,Range比较特殊。
   * Compare是用来比较2个字符串或数字，operator和to用来配合使用，operator是比较的操作符(==,>,<,>=,<=,!=)，to是用来比较的字符串；
   * Custom是定制验证的规则，regexp用来配合使用，regexp是正则表达试；
   * Length是验证字符串或数字的长度是否在一顶的范围内，min和max用来配合使用，min是最小的长度，max是最大的长度，如果不写max则被认为是长度必须等于min;
   * Range是数字是否在某个范围内，min和max用来配合使用。
   * 值得注意的是，如果需要判断的规则比较复杂，建议直接写正则表达式。
   *
   * @return void
   */
  setValidate: function(validateparam) {
    validateparam["result"] = true;
    this.validateparam = this.validateparam.concat([validateparam]);
  },
  /**
   * 得到验证的错误信息
   *
   * @param
   * @return string 字符串类型的返回结果
   */
  getError: function() {
    for (var k = 0; k < this.validateparam.length; k++) {
      var v = this.validateparam[k];
      if (v["result"] == false) {
        return {
          message: v["message"],
          obj: v["obj"]
        };
      }
    }
    return null;
  }
};
